package com.tql.mall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tql.mall.common.cache.MallCache;
import com.tql.mall.common.constant.RedisConstant;
import com.tql.mall.model.product.*;
import com.tql.mall.product.mapper.*;
import com.tql.mall.product.service.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: tyk
 * @Date: 2023/5/22 12:33
 * @Description:
 */
@Service
public class SpuServiceImpl implements SpuService {

    @Autowired
    private SpuInfoMapper spuInfoMapper;

    @Autowired
    private SpuSaleAttrMapper spuSaleAttrMapper;

    @Autowired
    private SpuSaleAttrValueMapper spuSaleAttrValueMapper;

    @Autowired
    private SpuImageMapper spuImageMapper;

    @Autowired
    private SpuPosterMapper spuPosterMapper;

    @Override
    public IPage<SpuInfo> getSpuInfoList(Long category3Id, Long shopId, Page<SpuInfo> pageInfo) {
        // 查询条件
        LambdaQueryWrapper<SpuInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SpuInfo::getCategory3Id, category3Id).eq(SpuInfo::getShopId, shopId);
        // 查询结果
        return spuInfoMapper.selectPage(pageInfo, wrapper);
    }

    @Override
    public void saveSpu(SpuInfo spuInfo) {
        // 保存Spu信息
        spuInfoMapper.insert(spuInfo);
        // 保存销售属性
        for (SpuSaleAttr spuSaleAttr : spuInfo.getSpuSaleAttrList()) {
            // 设置SpuID
            spuSaleAttr.setSpuId(spuInfo.getId());
            // 保存销售属性
            spuSaleAttrMapper.insert(spuSaleAttr);
            // 获取销售属性值
            for (SpuSaleAttrValue spuSaleAttrValue : spuSaleAttr.getSpuSaleAttrValueList()) {
                // 设置SpuID
                spuSaleAttrValue.setSpuId(spuInfo.getId());
                // 设置销售属性名称
                spuSaleAttrValue.setSaleAttrName(spuSaleAttr.getSaleAttrName());
                // 保存销售属性值
                spuSaleAttrValueMapper.insert(spuSaleAttrValue);
            }
        }
        // 保存图片
        for (SpuImage spuImage : spuInfo.getSpuImageList()) {
            // 设置SpuID
            spuImage.setSpuId(spuInfo.getId());
            // 保存图片到数据库
            spuImageMapper.insert(spuImage);
        }
        // 保存海报
        for (SpuPoster spuPoster : spuInfo.getSpuPosterList()) {
            // 设置SpuID
            spuPoster.setSpuId(spuInfo.getId());
            // 保存海报
            spuPosterMapper.insert(spuPoster);
        }

    }

    @Override
    public List<SpuImage> imageList(Long spuId) {
        // 查询条件
        LambdaQueryWrapper<SpuImage> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SpuImage::getSpuId, spuId);
        // 返回结果
        return spuImageMapper.selectList(wrapper);
    }

    @Override
    public List<SpuSaleAttr> saleAttrList(Long spuId) {
        return spuSaleAttrMapper.selectSpuSaleAttrList(spuId);
    }

    @Override
    @MallCache(prefix = RedisConstant.SPU_SALE_ATTR)
    public List<SpuSaleAttr> getSpuSaleAttr(Long skuId, Long spuId) {
        return spuSaleAttrMapper.selectSpuSaleAttrInfoList(skuId, spuId);
    }

    @Override
    @MallCache(prefix = RedisConstant.SPU_POSTER)
    public List<SpuPoster> getSpuPosterList(Long spuId) {
        // 查询条件
        LambdaQueryWrapper<SpuPoster> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SpuPoster::getSpuId, spuId);
        // 查询
        return spuPosterMapper.selectList(wrapper);
    }
}
